BS C++ 论文笔记


Author: Kimmy

HOPL 4

背景:C with Classes

选择C语言,因为足够好并且有良好的支持:因为DMR和Brain Kernighan的办公室跟BS在同一走廊。

C with Classes:最先加入的是构造器(new function)和析构器(delete function)。这也是C++至今都非常重要而且具有特色的一个功能(real heart of C++)。

C++引导加入了函数参数类型检测,同时被C吸收,成为了“函数原型”。

K&R为C++贡献了很多,同时BS也觉得自己给C贡献了很多。(函数定义、函数原型、const、单行注释)。

Object-orieted hype: C++从来没有声称过是一门面向对象的语言(但当年的新编程语言都说自己是“纯面向对象”)。

按照BS所认为的标准表述:“C++是一门偏向系统编程的通用编程语言(general-purpose programming language),它:

这依然是最准确的对C++的描述。当然相对“Everything is an object”来说,没那么吸引人。

第二个十年

主要是朝着工程化和标准化挺进:

语言特性

当然最重要的是RAII。

标准库

其中最重要的是基于Alexander Stepanov的标准模板库STL,以至于让C++在很长一段时间里都是泛型编程的标杆。

2006

HOPL 2006的39个proposal(为了接下来的C++0x,后来成为了C++11):

HOPL 2006 Proposal 列表:

  1. decltype & auto type deduction from expressions
  2. Template alias
  3. Extern template
  4. Move semantics
  5. Static assertion
  6. long long & other C99 features
  7. >> without space to terminate 2 template specializations
  8. Unicode data type
  9. Variadic templates
  10. Concepts
  11. Generalized constant expression
  12. Initializer lists as expressions
  13. Scoped and strongly typed enumerations
  14. Control of alignment
  15. nullptr
  16. Range based for statement
  17. Deletating constructors
  18. Inherited constructors
  19. Atomic operations
  20. Thread-local storage
  21. Defaulting and inhibiting common operations
  22. Lambda functions
  23. Programmer-controlled garbage collection
  24. In-class member intializers
  25. Allow local classes as template parameters
  26. Modules
  27. Dynamic library support
  28. Integer sub-ranges
  29. Multi-methods
  30. Class namespaces
  31. Continuations
  32. Contract programming
  33. User-defined operator dot
  34. switch on string
  35. Simple compile-time reflection
  36. #nomacro
  37. GUI support (e.g. slot & signals)
  38. Relfection
  39. Concurrency primitives in the language (not in a library)

已经进入了讨论是否要抛弃C++的阶段

原因:现代编程语言都是由一家控制并维护,C++仍处于传统的多个supplier维护,脱离于具体依赖的操作系统。

例子:

但C++:标准来自ISO、实现来自某几个vendor、各家有自己的扩展甚至是另外一种方言(C++/CLI、Objective C++)来配合自身的应用开发接口。

C++开始被其它语言超越:

希望:Boost

Boost一定程度上推进了C++的进化,非常像是C++的一个标准试验田。

相互影响

借鉴自其他编程语言的概念:

影响了其他编程语言的概念:

C++11:感觉就是个新语言

语言特性:

库:

总体成功的点:

C++14:完善C++11

Concepts

史前时代

C++模板设计的时候主要希望实现泛型编程,并且具备以下特性:

但是在实现过程中,很难同时达到三个点,所以只有:

前两点确保了C++模板的成功,但因为接口约束的问题,以至于直到C++17,模板的错误信息依然几乎不可读。所以BS在很早就在考虑如何设计模板约束。

Concepts来自Alex Stepanov在70年代后期的“Algebric structures”("代数结构"),大概比Haskell的type class还要早了10年。90年代的时候Alex开始使用“concept”这个名字。

早期的Concepts现在看起来问题挺多,但大致上提供了一些现有Concepts的雏形:

C++0x Concepts

C++0x的Concepts来自于不同两拨人达成一致后的设计成果:一波是“印第安纳派”,Andrew Lumsdaine和Dogulas Gregor,其想法是把concept作为建模工具;一波是“德克萨斯派”,Bjarne Stroustrup和Gabriel Dos Reis,想法是把concept作为类型约束。

这两者思路合并以后也就成了后面的一系列问题。

C++0x的定义非常像一个类结构。使用起来比较简单,把Concept作为模板的约束(类似C#的where,后改成requires)或者作为模板参数的约束。

同时C++0x的concept加入了定义检查,如果在被约束的类型中使用了未在concept中声明的操作,将会导致编译错误。而混用未加约束的代码更容易带来这个问题,于是加入了late_check块来避免。

但是对于concept和类型的关系,需要用concept_map来显式实例化。(这就是“建模”方面的倾向)。经过这样的显式实例化以后,可以非侵入式地给一个自定义类型添加操作。

但是如果作为约束的话,这样就很麻烦了,每个类型都要进行concept_map一下,而如果这个concept并没有添加新的功能,这样的动作就显得很多余。于是德克萨斯派提供了一套隐式concept_map的做法,即在concept定义的时候添加一个auto关键字,会自动对对应需要约束的类型自动作concept_map。

于是关于显式或者隐式这个观点,就成了一个争议点,一直都没能达成统一。

另外除了concept_map外,C++0x的Concepts作为一个大而全的设计,还加入了late_check、axiom等额外的功能。但这样一来,不止整个Concepts变得越来越复杂,相对于未加concept约束的代码,编译时间远超了很多倍。

加上因为混合concept_map、late_check和约束/非约束代码的混合带来的整体混乱,以及“建模”概念对于大部分程序员“可能”的“不友好”,委员会决定把concept移出C++0x。

Concepts TS

C++0x Concepts得出的设计结论:

Alex Stepanov在2011年拉了个会讨论新的Concepts,主要的关注点是,以使用者的角度设计一套STL泛型算法的约束。这个角度比C++0x的方向要直接得多,直接结果就是2016年的Concepts TS和C++20 concepts,并且这套设计从2012年就由Andrew Sutton实现并一直随着GCC 6.0发布验证。

Concepts TS的主要关注点是:

C++20 Concepts

C++20的主要变动就是Concepts使用的时候的表示法,以某种形式增强了Concepts TS的语法,来避免可能存在的歧义。

C++17

语言特性:

库:

其中有部分非常希望进入C++17但没有的特性:

创建时间:2020-08-02 最近更新时间:2023-11-03